ace.define(
  "ace/mode/css_highlight_rules",
  [
    "require",
    "exports",
    "module",
    "ace/lib/oop",
    "ace/lib/lang",
    "ace/mode/text_highlight_rules"
  ],
  function(require, exports, module) {
    "use strict";

    var oop = require("../lib/oop");
    var lang = require("../lib/lang");
    var TextHighlightRules = require("./text_highlight_rules")
      .TextHighlightRules;
    var supportType = (exports.supportType =
      "align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|max-zoom|min-height|min-width|min-zoom|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|user-select|user-zoom|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index");
    var supportFunction = (exports.supportFunction =
      "rgb|rgba|url|attr|counter|counters");
    var supportConstant = (exports.supportConstant =
      "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero|zoom");
    var supportConstantColor = (exports.supportConstantColor =
      "aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen");
    var supportConstantFonts = (exports.supportConstantFonts =
      "arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace");

    var numRe = (exports.numRe =
      "\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))");
    var pseudoElements = (exports.pseudoElements =
      "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b");
    var pseudoClasses = (exports.pseudoClasses =
      "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b");

    var CssHighlightRules = function() {
      var keywordMapper = this.createKeywordMapper(
        {
          "support.function": supportFunction,
          "support.constant": supportConstant,
          "support.type": supportType,
          "support.constant.color": supportConstantColor,
          "support.constant.fonts": supportConstantFonts
        },
        "text",
        true
      );

      this.$rules = {
        start: [
          {
            include: ["strings", "url", "comments"]
          },
          {
            token: "paren.lparen",
            regex: "\\{",
            next: "ruleset"
          },
          {
            token: "paren.rparen",
            regex: "\\}"
          },
          {
            token: "string",
            regex: "@(?!viewport)",
            next: "media"
          },
          {
            token: "keyword",
            regex: "#[a-z0-9-_]+"
          },
          {
            token: "keyword",
            regex: "%"
          },
          {
            token: "variable",
            regex: "\\.[a-z0-9-_]+"
          },
          {
            token: "string",
            regex: ":[a-z0-9-_]+"
          },
          {
            token: "constant.numeric",
            regex: numRe
          },
          {
            token: "constant",
            regex: "[a-z0-9-_]+"
          },
          {
            caseInsensitive: true
          }
        ],

        media: [
          {
            include: ["strings", "url", "comments"]
          },
          {
            token: "paren.lparen",
            regex: "\\{",
            next: "start"
          },
          {
            token: "paren.rparen",
            regex: "\\}",
            next: "start"
          },
          {
            token: "string",
            regex: ";",
            next: "start"
          },
          {
            token: "keyword",
            regex:
              "(?:media|supports|document|charset|import|namespace|media|supports|document" +
              "|page|font|keyframes|viewport|counter-style|font-feature-values" +
              "|swash|ornaments|annotation|stylistic|styleset|character-variant)"
          }
        ],

        comments: [
          {
            token: "comment", // multi line comment
            regex: "\\/\\*",
            push: [
              {
                token: "comment",
                regex: "\\*\\/",
                next: "pop"
              },
              {
                defaultToken: "comment"
              }
            ]
          }
        ],

        ruleset: [
          {
            regex: "-(webkit|ms|moz|o)-",
            token: "text"
          },
          {
            token: "punctuation.operator",
            regex: "[:;]"
          },
          {
            token: "paren.rparen",
            regex: "\\}",
            next: "start"
          },
          {
            include: ["strings", "url", "comments"]
          },
          {
            token: ["constant.numeric", "keyword"],
            regex:
              "(" +
              numRe +
              ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vmax|vmin|vm|vw|%)"
          },
          {
            token: "constant.numeric",
            regex: numRe
          },
          {
            token: "constant.numeric", // hex6 color
            regex: "#[a-f0-9]{6}"
          },
          {
            token: "constant.numeric", // hex3 color
            regex: "#[a-f0-9]{3}"
          },
          {
            token: [
              "punctuation",
              "entity.other.attribute-name.pseudo-element.css"
            ],
            regex: pseudoElements
          },
          {
            token: [
              "punctuation",
              "entity.other.attribute-name.pseudo-class.css"
            ],
            regex: pseudoClasses
          },
          {
            include: "url"
          },
          {
            token: keywordMapper,
            regex: "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*"
          },
          {
            caseInsensitive: true
          }
        ],

        url: [
          {
            token: "support.function",
            regex: "(?:url(:?-prefix)?|domain|regexp)\\(",
            push: [
              {
                token: "support.function",
                regex: "\\)",
                next: "pop"
              },
              {
                defaultToken: "string"
              }
            ]
          }
        ],

        strings: [
          {
            token: "string.start",
            regex: "'",
            push: [
              {
                token: "string.end",
                regex: "'|$",
                next: "pop"
              },
              {
                include: "escapes"
              },
              {
                token: "constant.language.escape",
                regex: /\\$/,
                consumeLineEnd: true
              },
              {
                defaultToken: "string"
              }
            ]
          },
          {
            token: "string.start",
            regex: '"',
            push: [
              {
                token: "string.end",
                regex: '"|$',
                next: "pop"
              },
              {
                include: "escapes"
              },
              {
                token: "constant.language.escape",
                regex: /\\$/,
                consumeLineEnd: true
              },
              {
                defaultToken: "string"
              }
            ]
          }
        ],
        escapes: [
          {
            token: "constant.language.escape",
            regex: /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/
          }
        ]
      };

      this.normalizeRules();
    };

    oop.inherits(CssHighlightRules, TextHighlightRules);

    exports.CssHighlightRules = CssHighlightRules;
  }
);

ace.define(
  "ace/mode/matching_brace_outdent",
  ["require", "exports", "module", "ace/range"],
  function(require, exports, module) {
    "use strict";

    var Range = require("../range").Range;

    var MatchingBraceOutdent = function() {};

    (function() {
      this.checkOutdent = function(line, input) {
        if (!/^\s+$/.test(line)) return false;

        return /^\s*\}/.test(input);
      };

      this.autoOutdent = function(doc, row) {
        var line = doc.getLine(row);
        var match = line.match(/^(\s*\})/);

        if (!match) return 0;

        var column = match[1].length;
        var openBracePos = doc.findMatchingBracket({
          row: row,
          column: column
        });

        if (!openBracePos || openBracePos.row == row) return 0;

        var indent = this.$getIndent(doc.getLine(openBracePos.row));
        doc.replace(new Range(row, 0, row, column - 1), indent);
      };

      this.$getIndent = function(line) {
        return line.match(/^\s*/)[0];
      };
    }.call(MatchingBraceOutdent.prototype));

    exports.MatchingBraceOutdent = MatchingBraceOutdent;
  }
);

ace.define(
  "ace/mode/css_completions",
  ["require", "exports", "module"],
  function(require, exports, module) {
    "use strict";

    var propertyMap = {
      background: { "#$0": 1 },
      "background-color": { "#$0": 1, transparent: 1, fixed: 1 },
      "background-image": { "url('/$0')": 1 },
      "background-repeat": {
        repeat: 1,
        "repeat-x": 1,
        "repeat-y": 1,
        "no-repeat": 1,
        inherit: 1
      },
      "background-position": {
        bottom: 2,
        center: 2,
        left: 2,
        right: 2,
        top: 2,
        inherit: 2
      },
      "background-attachment": { scroll: 1, fixed: 1 },
      "background-size": { cover: 1, contain: 1 },
      "background-clip": {
        "border-box": 1,
        "padding-box": 1,
        "content-box": 1
      },
      "background-origin": {
        "border-box": 1,
        "padding-box": 1,
        "content-box": 1
      },
      border: { "solid $0": 1, "dashed $0": 1, "dotted $0": 1, "#$0": 1 },
      "border-color": { "#$0": 1 },
      "border-style": {
        solid: 2,
        dashed: 2,
        dotted: 2,
        double: 2,
        groove: 2,
        hidden: 2,
        inherit: 2,
        inset: 2,
        none: 2,
        outset: 2,
        ridged: 2
      },
      "border-collapse": { collapse: 1, separate: 1 },
      bottom: { px: 1, em: 1, "%": 1 },
      clear: { left: 1, right: 1, both: 1, none: 1 },
      color: { "#$0": 1, "rgb(#$00,0,0)": 1 },
      cursor: {
        default: 1,
        pointer: 1,
        move: 1,
        text: 1,
        wait: 1,
        help: 1,
        progress: 1,
        "n-resize": 1,
        "ne-resize": 1,
        "e-resize": 1,
        "se-resize": 1,
        "s-resize": 1,
        "sw-resize": 1,
        "w-resize": 1,
        "nw-resize": 1
      },
      display: {
        none: 1,
        block: 1,
        inline: 1,
        "inline-block": 1,
        "table-cell": 1
      },
      "empty-cells": { show: 1, hide: 1 },
      float: { left: 1, right: 1, none: 1 },
      "font-family": {
        Arial: 2,
        "Comic Sans MS": 2,
        Consolas: 2,
        "Courier New": 2,
        Courier: 2,
        Georgia: 2,
        Monospace: 2,
        "Sans-Serif": 2,
        "Segoe UI": 2,
        Tahoma: 2,
        "Times New Roman": 2,
        "Trebuchet MS": 2,
        Verdana: 1
      },
      "font-size": { px: 1, em: 1, "%": 1 },
      "font-weight": { bold: 1, normal: 1 },
      "font-style": { italic: 1, normal: 1 },
      "font-variant": { normal: 1, "small-caps": 1 },
      height: { px: 1, em: 1, "%": 1 },
      left: { px: 1, em: 1, "%": 1 },
      "letter-spacing": { normal: 1 },
      "line-height": { normal: 1 },
      "list-style-type": {
        none: 1,
        disc: 1,
        circle: 1,
        square: 1,
        decimal: 1,
        "decimal-leading-zero": 1,
        "lower-roman": 1,
        "upper-roman": 1,
        "lower-greek": 1,
        "lower-latin": 1,
        "upper-latin": 1,
        georgian: 1,
        "lower-alpha": 1,
        "upper-alpha": 1
      },
      margin: { px: 1, em: 1, "%": 1 },
      "margin-right": { px: 1, em: 1, "%": 1 },
      "margin-left": { px: 1, em: 1, "%": 1 },
      "margin-top": { px: 1, em: 1, "%": 1 },
      "margin-bottom": { px: 1, em: 1, "%": 1 },
      "max-height": { px: 1, em: 1, "%": 1 },
      "max-width": { px: 1, em: 1, "%": 1 },
      "min-height": { px: 1, em: 1, "%": 1 },
      "min-width": { px: 1, em: 1, "%": 1 },
      overflow: { hidden: 1, visible: 1, auto: 1, scroll: 1 },
      "overflow-x": { hidden: 1, visible: 1, auto: 1, scroll: 1 },
      "overflow-y": { hidden: 1, visible: 1, auto: 1, scroll: 1 },
      padding: { px: 1, em: 1, "%": 1 },
      "padding-top": { px: 1, em: 1, "%": 1 },
      "padding-right": { px: 1, em: 1, "%": 1 },
      "padding-bottom": { px: 1, em: 1, "%": 1 },
      "padding-left": { px: 1, em: 1, "%": 1 },
      "page-break-after": { auto: 1, always: 1, avoid: 1, left: 1, right: 1 },
      "page-break-before": { auto: 1, always: 1, avoid: 1, left: 1, right: 1 },
      position: { absolute: 1, relative: 1, fixed: 1, static: 1 },
      right: { px: 1, em: 1, "%": 1 },
      "table-layout": { fixed: 1, auto: 1 },
      "text-decoration": { none: 1, underline: 1, "line-through": 1, blink: 1 },
      "text-align": { left: 1, right: 1, center: 1, justify: 1 },
      "text-transform": { capitalize: 1, uppercase: 1, lowercase: 1, none: 1 },
      top: { px: 1, em: 1, "%": 1 },
      "vertical-align": { top: 1, bottom: 1 },
      visibility: { hidden: 1, visible: 1 },
      "white-space": {
        nowrap: 1,
        normal: 1,
        pre: 1,
        "pre-line": 1,
        "pre-wrap": 1
      },
      width: { px: 1, em: 1, "%": 1 },
      "word-spacing": { normal: 1 },
      filter: { "alpha(opacity=$0100)": 1 },

      "text-shadow": { "$02px 2px 2px #777": 1 },
      "text-overflow": { "ellipsis-word": 1, clip: 1, ellipsis: 1 },
      "-moz-border-radius": 1,
      "-moz-border-radius-topright": 1,
      "-moz-border-radius-bottomright": 1,
      "-moz-border-radius-topleft": 1,
      "-moz-border-radius-bottomleft": 1,
      "-webkit-border-radius": 1,
      "-webkit-border-top-right-radius": 1,
      "-webkit-border-top-left-radius": 1,
      "-webkit-border-bottom-right-radius": 1,
      "-webkit-border-bottom-left-radius": 1,
      "-moz-box-shadow": 1,
      "-webkit-box-shadow": 1,
      transform: { "rotate($00deg)": 1, "skew($00deg)": 1 },
      "-moz-transform": { "rotate($00deg)": 1, "skew($00deg)": 1 },
      "-webkit-transform": { "rotate($00deg)": 1, "skew($00deg)": 1 }
    };

    var CssCompletions = function() {};

    (function() {
      this.completionsDefined = false;

      this.defineCompletions = function() {
        if (document) {
          var style = document.createElement("c").style;

          for (var i in style) {
            if (typeof style[i] !== "string") continue;

            var name = i.replace(/[A-Z]/g, function(x) {
              return "-" + x.toLowerCase();
            });

            if (!propertyMap.hasOwnProperty(name)) propertyMap[name] = 1;
          }
        }

        this.completionsDefined = true;
      };

      this.getCompletions = function(state, session, pos, prefix) {
        if (!this.completionsDefined) {
          this.defineCompletions();
        }

        if (state === "ruleset" || session.$mode.$id == "ace/mode/scss") {
          var line = session.getLine(pos.row).substr(0, pos.column);
          if (/:[^;]+$/.test(line)) {
            /([\w\-]+):[^:]*$/.test(line);

            return this.getPropertyValueCompletions(
              state,
              session,
              pos,
              prefix
            );
          } else {
            return this.getPropertyCompletions(state, session, pos, prefix);
          }
        }

        return [];
      };

      this.getPropertyCompletions = function(state, session, pos, prefix) {
        var properties = Object.keys(propertyMap);
        return properties.map(function(property) {
          return {
            caption: property,
            snippet: property + ": $0;",
            meta: "property",
            score: 1000000
          };
        });
      };

      this.getPropertyValueCompletions = function(state, session, pos, prefix) {
        var line = session.getLine(pos.row).substr(0, pos.column);
        var property = (/([\w\-]+):[^:]*$/.exec(line) || {})[1];

        if (!property) return [];
        var values = [];
        if (
          property in propertyMap &&
          typeof propertyMap[property] === "object"
        ) {
          values = Object.keys(propertyMap[property]);
        }
        return values.map(function(value) {
          return {
            caption: value,
            snippet: value,
            meta: "property value",
            score: 1000000
          };
        });
      };
    }.call(CssCompletions.prototype));

    exports.CssCompletions = CssCompletions;
  }
);

ace.define(
  "ace/mode/behaviour/css",
  [
    "require",
    "exports",
    "module",
    "ace/lib/oop",
    "ace/mode/behaviour",
    "ace/mode/behaviour/cstyle",
    "ace/token_iterator"
  ],
  function(require, exports, module) {
    "use strict";

    var oop = require("../../lib/oop");
    var Behaviour = require("../behaviour").Behaviour;
    var CstyleBehaviour = require("./cstyle").CstyleBehaviour;
    var TokenIterator = require("../../token_iterator").TokenIterator;

    var CssBehaviour = function() {
      this.inherit(CstyleBehaviour);

      this.add("colon", "insertion", function(
        state,
        action,
        editor,
        session,
        text
      ) {
        if (text === ":" && editor.selection.isEmpty()) {
          var cursor = editor.getCursorPosition();
          var iterator = new TokenIterator(session, cursor.row, cursor.column);
          var token = iterator.getCurrentToken();
          if (token && token.value.match(/\s+/)) {
            token = iterator.stepBackward();
          }
          if (token && token.type === "support.type") {
            var line = session.doc.getLine(cursor.row);
            var rightChar = line.substring(cursor.column, cursor.column + 1);
            if (rightChar === ":") {
              return {
                text: "",
                selection: [1, 1]
              };
            }
            if (/^(\s+[^;]|\s*$)/.test(line.substring(cursor.column))) {
              return {
                text: ":;",
                selection: [1, 1]
              };
            }
          }
        }
      });

      this.add("colon", "deletion", function(
        state,
        action,
        editor,
        session,
        range
      ) {
        var selected = session.doc.getTextRange(range);
        if (!range.isMultiLine() && selected === ":") {
          var cursor = editor.getCursorPosition();
          var iterator = new TokenIterator(session, cursor.row, cursor.column);
          var token = iterator.getCurrentToken();
          if (token && token.value.match(/\s+/)) {
            token = iterator.stepBackward();
          }
          if (token && token.type === "support.type") {
            var line = session.doc.getLine(range.start.row);
            var rightChar = line.substring(
              range.end.column,
              range.end.column + 1
            );
            if (rightChar === ";") {
              range.end.column++;
              return range;
            }
          }
        }
      });

      this.add("semicolon", "insertion", function(
        state,
        action,
        editor,
        session,
        text
      ) {
        if (text === ";" && editor.selection.isEmpty()) {
          var cursor = editor.getCursorPosition();
          var line = session.doc.getLine(cursor.row);
          var rightChar = line.substring(cursor.column, cursor.column + 1);
          if (rightChar === ";") {
            return {
              text: "",
              selection: [1, 1]
            };
          }
        }
      });

      this.add("!important", "insertion", function(
        state,
        action,
        editor,
        session,
        text
      ) {
        if (text === "!" && editor.selection.isEmpty()) {
          var cursor = editor.getCursorPosition();
          var line = session.doc.getLine(cursor.row);

          if (/^\s*(;|}|$)/.test(line.substring(cursor.column))) {
            return {
              text: "!important",
              selection: [10, 10]
            };
          }
        }
      });
    };
    oop.inherits(CssBehaviour, CstyleBehaviour);

    exports.CssBehaviour = CssBehaviour;
  }
);

ace.define(
  "ace/mode/folding/cstyle",
  [
    "require",
    "exports",
    "module",
    "ace/lib/oop",
    "ace/range",
    "ace/mode/folding/fold_mode"
  ],
  function(require, exports, module) {
    "use strict";

    var oop = require("../../lib/oop");
    var Range = require("../../range").Range;
    var BaseFoldMode = require("./fold_mode").FoldMode;

    var FoldMode = (exports.FoldMode = function(commentRegex) {
      if (commentRegex) {
        this.foldingStartMarker = new RegExp(
          this.foldingStartMarker.source.replace(
            /\|[^|]*?$/,
            "|" + commentRegex.start
          )
        );
        this.foldingStopMarker = new RegExp(
          this.foldingStopMarker.source.replace(
            /\|[^|]*?$/,
            "|" + commentRegex.end
          )
        );
      }
    });
    oop.inherits(FoldMode, BaseFoldMode);

    (function() {
      this.foldingStartMarker = /([\{\[\(])[^\}\]\)]*$|^\s*(\/\*)/;
      this.foldingStopMarker = /^[^\[\{\(]*([\}\]\)])|^[\s\*]*(\*\/)/;
      this.singleLineBlockCommentRe = /^\s*(\/\*).*\*\/\s*$/;
      this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/;
      this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/;
      this._getFoldWidgetBase = this.getFoldWidget;
      this.getFoldWidget = function(session, foldStyle, row) {
        var line = session.getLine(row);

        if (this.singleLineBlockCommentRe.test(line)) {
          if (
            !this.startRegionRe.test(line) &&
            !this.tripleStarBlockCommentRe.test(line)
          )
            return "";
        }

        var fw = this._getFoldWidgetBase(session, foldStyle, row);

        if (!fw && this.startRegionRe.test(line)) return "start"; // lineCommentRegionStart

        return fw;
      };

      this.getFoldWidgetRange = function(
        session,
        foldStyle,
        row,
        forceMultiline
      ) {
        var line = session.getLine(row);

        if (this.startRegionRe.test(line))
          return this.getCommentRegionBlock(session, line, row);

        var match = line.match(this.foldingStartMarker);
        if (match) {
          var i = match.index;

          if (match[1])
            return this.openingBracketBlock(session, match[1], row, i);

          var range = session.getCommentFoldRange(row, i + match[0].length, 1);

          if (range && !range.isMultiLine()) {
            if (forceMultiline) {
              range = this.getSectionRange(session, row);
            } else if (foldStyle != "all") range = null;
          }

          return range;
        }

        if (foldStyle === "markbegin") return;

        var match = line.match(this.foldingStopMarker);
        if (match) {
          var i = match.index + match[0].length;

          if (match[1])
            return this.closingBracketBlock(session, match[1], row, i);

          return session.getCommentFoldRange(row, i, -1);
        }
      };

      this.getSectionRange = function(session, row) {
        var line = session.getLine(row);
        var startIndent = line.search(/\S/);
        var startRow = row;
        var startColumn = line.length;
        row = row + 1;
        var endRow = row;
        var maxRow = session.getLength();
        while (++row < maxRow) {
          line = session.getLine(row);
          var indent = line.search(/\S/);
          if (indent === -1) continue;
          if (startIndent > indent) break;
          var subRange = this.getFoldWidgetRange(session, "all", row);

          if (subRange) {
            if (subRange.start.row <= startRow) {
              break;
            } else if (subRange.isMultiLine()) {
              row = subRange.end.row;
            } else if (startIndent == indent) {
              break;
            }
          }
          endRow = row;
        }

        return new Range(
          startRow,
          startColumn,
          endRow,
          session.getLine(endRow).length
        );
      };
      this.getCommentRegionBlock = function(session, line, row) {
        var startColumn = line.search(/\s*$/);
        var maxRow = session.getLength();
        var startRow = row;

        var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/;
        var depth = 1;
        while (++row < maxRow) {
          line = session.getLine(row);
          var m = re.exec(line);
          if (!m) continue;
          if (m[1]) depth--;
          else depth++;

          if (!depth) break;
        }

        var endRow = row;
        if (endRow > startRow) {
          return new Range(startRow, startColumn, endRow, line.length);
        }
      };
    }.call(FoldMode.prototype));
  }
);

ace.define(
  "ace/mode/css",
  [
    "require",
    "exports",
    "module",
    "ace/lib/oop",
    "ace/mode/text",
    "ace/mode/css_highlight_rules",
    "ace/mode/matching_brace_outdent",
    "ace/worker/worker_client",
    "ace/mode/css_completions",
    "ace/mode/behaviour/css",
    "ace/mode/folding/cstyle"
  ],
  function(require, exports, module) {
    "use strict";

    var oop = require("../lib/oop");
    var TextMode = require("./text").Mode;
    var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;
    var MatchingBraceOutdent = require("./matching_brace_outdent")
      .MatchingBraceOutdent;
    var WorkerClient = require("../worker/worker_client").WorkerClient;
    var CssCompletions = require("./css_completions").CssCompletions;
    var CssBehaviour = require("./behaviour/css").CssBehaviour;
    var CStyleFoldMode = require("./folding/cstyle").FoldMode;

    var Mode = function() {
      this.HighlightRules = CssHighlightRules;
      this.$outdent = new MatchingBraceOutdent();
      this.$behaviour = new CssBehaviour();
      this.$completer = new CssCompletions();
      this.foldingRules = new CStyleFoldMode();
    };
    oop.inherits(Mode, TextMode);

    (function() {
      this.foldingRules = "cStyle";
      this.blockComment = { start: "/*", end: "*/" };

      this.getNextLineIndent = function(state, line, tab) {
        var indent = this.$getIndent(line);
        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;
        if (tokens.length && tokens[tokens.length - 1].type == "comment") {
          return indent;
        }

        var match = line.match(/^.*\{\s*$/);
        if (match) {
          indent += tab;
        }

        return indent;
      };

      this.checkOutdent = function(state, line, input) {
        return this.$outdent.checkOutdent(line, input);
      };

      this.autoOutdent = function(state, doc, row) {
        this.$outdent.autoOutdent(doc, row);
      };

      this.getCompletions = function(state, session, pos, prefix) {
        return this.$completer.getCompletions(state, session, pos, prefix);
      };

      this.createWorker = function(session) {
        var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker");
        worker.attachToDocument(session.getDocument());

        worker.on("annotate", function(e) {
          session.setAnnotations(e.data);
        });

        worker.on("terminate", function() {
          session.clearAnnotations();
        });

        return worker;
      };

      this.$id = "ace/mode/css";
    }.call(Mode.prototype));

    exports.Mode = Mode;
  }
);
(function() {
  ace.require(["ace/mode/css"], function(m) {
    if (typeof module == "object" && typeof exports == "object" && module) {
      module.exports = m;
    }
  });
})();
